package com.iter.devbox.pattern.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 主题角色类
 * 
 * @author Jimly
 */
public class Subject {
	
	/**当前主题的状态*/
	private String state;
	
	/**用来保存注册的观察者对象*/
    private List<Observer> list = new ArrayList<Observer>();
    
    /**
     * 获取当前主题的状态
     * 
     * @return
     */
    public String getState() {
        return state;
    }
    
    /**
     * 注册观察者对象
     * 
     * @param observer观察者对象
     */
    public void attach(Observer observer) {
        list.add(observer);
        System.out.println("注册了一个观察者OK");
    }
    
    /**
     * 删除观察者对象
     * 
     * @param observer观察者对象
     */
    public void detach(Observer observer){
        list.remove(observer);
        System.out.println("删除了一个观察者OK");
    }
    
    /**
     * 通知所有注册的观察者对象
     * 
     * @param newState当前主题新的状态
     */
    public void nodifyAllObservers(String newState){
        for(Observer observer : list) {
        	//观察者更新自己的状态
            observer.update(newState);
            System.out.println("通知已注册的观察者对象：" + observer.toString());
        }
    }
    
    /**
     * 当前主题状态发生改变
     * 
     * @param newState
     */
    public void change(String newState) {
        state = newState;
        System.out.println("主题状态为：" + state);
        //状态发生改变，通知各个观察者
        this.nodifyAllObservers(state);
    }
}
